package bytezero.threadsynchronization;



/**
 *  使用同步方法解决实现 Runnable接口的线程安全问题
 *
 *  关于同步方法的总结：
 * 1.同步方法仍热涉及到同步监视器，只是不需要我们显示声明。
 * 2.非静态的同步方法，同步监视器是：this
 *   静态的同步方法，同步监视器是：当前类的本身
 *
 *
 * @author Bytezero1·zhenglei!    Email:420498246@qq.com
 * create  2021-10-17 16:39
 */
class WindowM2 implements Runnable{
    private int ticket = 100;  //Runnable 里面共用一个   private int ticket = 100;
    @Override
    public  void run() {
        while(true){

            show();
        }
    }

    //同步方法
    private synchronized void show(){   //同步监视器 ： this
       // synchronized (this){   //同步代码块

            if(ticket >0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+ ":买票，票号为："+ticket);
                ticket--;
            }
       // }
    }
}

public class Window2Method {
    public static void main(String[] args) {
        WindowM2 w2 = new WindowM2();  //一个对象 放入了三个 构造器中，共用了 100

        Thread t1 = new Thread(w2);
        Thread t2 = new Thread(w2);
        Thread t3 = new Thread(w2);

        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");

        t1.start();
        t2.start();
        t3.start();
    }
}

